package top.frsf.rpc.constants;

/**
 * RPC 协议常量类
 *
 * @author He Kuntao
 * @since 2025/7/2 11:21
 */
public final class RpcConstants {

    // ================ 协议头字段 ================
    /**
     * 魔数（2字节），用于标识 RPC 协议
     */
    public static final short MAGIC = (short) 0xCAFE;

    /**
     * 协议版本（1字节）
     */
    public static final byte VERSION = 1;

    /**
     * 最大帧长度（1MB）
     */
    public static final int MAX_FRAME_LENGTH = 1024 * 1024;

    /**
     * 协议头总长度（ LENGTH_FIELD_OFFSET + 4 bodyLength）
     */
    public static final int HEADER_LENGTH = 18;

    /**
     * 长度字段偏移量 ( 2 magic + 1 version + 1 flags + 1 serialType + 1 status + 8 requestId )
     */
    public static final int LENGTH_FIELD_OFFSET = 14;

    /**
     * 长度字段长度 4
     */
    public static final int LENGTH_FIELD_LENGTH = 4;

    /**
     * Length to Body skip  length
     */
    public static final int NUM_SKIP_BODY_LENGTH = 0;

    /**
     * 解析完成，消除字节数
     */
    public static final int FINISH_SKIP_LENGTH = 0;

    // ================ 标志位（flags） ================
    /**
     * 标志位：请求（0）
     */
    public static final byte FLAG_REQUEST = 0b00000000;

    /**
     * 标志位：响应（1）
     */
    public static final byte FLAG_RESPONSE = 0b00000001;

    /**
     * 标志位：需要ACK（bit1=1）
     */
    public static final byte FLAG_NEED_ACK = 0b00000010;

    /**
     * 标志位：分片消息（bit2=1）
     */
    public static final byte FLAG_FRAGMENT = 0b00000100;


    // ================ 序列化类型（serialType） ================
    /**
     * 序列化方式：JSON
     */
    public static final byte SERIALIZER_JSON = 0;

    /**
     * 序列化方式：Protobuf
     */
    public static final byte SERIALIZER_PROTOBUF = 1;

    /**
     * 序列化方式：Kryo
     */
    public static final byte SERIALIZER_KRYO = 2;


    // ================ 状态码（status） ================
    /**
     * 状态码：成功
     */
    public static final byte STATUS_OK = 0;

    /**
     * 状态码：服务不存在
     */
    public static final byte STATUS_SERVICE_NOT_FOUND = 1;

    /**
     * 状态码：方法不存在
     */
    public static final byte STATUS_METHOD_NOT_FOUND = 2;

    /**
     * 状态码：参数错误
     */
    public static final byte STATUS_BAD_REQUEST = 3;

    /**
     * 状态码：服务器内部错误
     */
    public static final byte STATUS_INTERNAL_ERROR = 4;


    // ================ 其他常量 ================
    /**
     * 心跳请求ID（特殊值）
     */
    public static final long HEARTBEAT_REQUEST_ID = -1;

    /**
     * 心跳间隔（秒）
     */
    public static final int HEARTBEAT_INTERVAL = 30;

    /**
     * 默认超时时间（毫秒）
     */
    public static final long DEFAULT_TIMEOUT_MS = 3000;

}
